Alpha

The native-first framework for modern web apps.

A high-performance, zero-VDOM framework that compiles JSX to native DOM. Built with signals and standard Web Components.

$npm create @opentf/web@latest my-app

Watch a change flow.

Fine-grained signals, no virtual DOM. Edit a value and the update travels only the dependency path it has to — flashing the exact DOM nodes it owns, and nothing else.

Cart.jsx — preview
qty
price
subtotal
tax
total
coupon
Live DOM
Qty2
Price$9.00
Subtotal$18.00
Tax (10%)$1.80
Total$19.80
Coupon

Fast where it counts.

The standard js-framework-benchmark operation set vs React, Solid, and Svelte 5 — one shared harness, production builds, 4× CPU throttle. Median ms over 10–12 samples, lower is better.

Operationotfwreactsolidsvelte
create 1,000 rows243.3278.7257.8258.6
create 10,000 rows2808.33389.72516.32463.6
append 1,000 to 1,000305.1304.6262.7257.5
update every 10th (1k)93.998.512188.8
swap 2 rows (1k)34.3254.430.731.3
select row (1k)25.327.628.128.9
remove row (1k)3842.141.542.1
clear 10,000 rows195.2260.7157.7162.4

Bold marks a winner only when the margin beats the ~8.3 ms timing resolution — anything closer is a tie. Indicative, not a head-to-head. Run it yourself: bun run bench all.

Cheap to build, too.

What it costs to build a static site — not to run one. Five toolchains, each pre-rendering the same 72 KB MDX docs page. Peak memory and wall time, lower is better.

Metricotfwastronexttanstackvite
Peak build memory (MB)1404161226510260
Build time (s)0.31.23.820.8

Not all equal work: astro and vite ship no client JS for these pages, while OTF Web, Next.js and TanStack Start also build a hydration bundle. Read the columns as two runs, not one: ours was re-measured after the build fixes in @opentf/web-compiler, the other four are the original sweep and were not re-run — so treat small gaps as noise. The lead holds up the ladder now (a 2.3 MB page builds in 2.9 s against Astro’s 3.7 s), where it used to reverse past about a megabyte. Method, the full 72 KB→2.3 MB ladder, and every caveat: benchmarks/ssg-build.

Capabilities & roadmap

A transparent look at what ships today and what's next.

Client Rendering (CSR)Supported

Compiler-driven SPA engine.

Core
Zero-VDOM updatesSupported

Direct DOM operations, no diff.

Core
Reactive macrosSupported

$state, $derived, $effect, $context on fine-grained signals.

Core
Refs & exposeSupported

$ref to elements; imperative $expose.

Core
Context APISupported

Scoped DI with createContext, ContextProvider, and $context — no prop drilling.

Core
PortalSupported

Render a subtree into another DOM target; context resolves across the boundary.

Core
File-based routerSupported

Directory routing with client-side navigation.

Routing
Nested layoutsSupported

Persistent UI across route changes.

Routing
Route guardsSupported

Protect routes with custom logic + redirects.

Routing
Code splittingSupported

Per-route lazy chunks in `otfw build`; dev compiles a route on first visit.

Routing
Route prefetchPlanned

Preload route chunks on hover or when a link enters the viewport.

Routing
Static generation (SSG)Supported

Pre-render routes to HTML at build time.

Rendering
MDXSupported

MDX pages and components; docs theme included.

Rendering
Server rendering (SSR)Supported

Per-request HTML via otfw serve — the same render path as SSG.

Rendering
HydrationSupported

First paint adopts the server DOM — pages, layouts, lists, conditionals, and islands with rich props.

Rendering
create-web scaffolderSupported

App, Docs, or Library templates — JS/TS, auto-install, npm-pinned deps.

Tooling & DX
Dev server + reload on savePartial

On-demand per-route compile. Edits under app/ rebuild and trigger a full-page refresh — not module-level HMR.

Tooling & DX
Module-level HMRPlanned

Hot-swap changed modules in place without reloading the tab.

Tooling & DX
Dev error overlaySupported

In-browser error reporting during dev.

Tooling & DX
Testing librarySupported

Component testing utilities.

Tooling & DX
TypeScript / TSXBeta

Scaffold .tsx projects with tsconfig and macro typings; full editor tooling in progress.

Tooling & DX
Devtools extensionPlanned

Component, state, and network inspection.

Tooling & DX
Tailwind CSSSupported

Compiled by the toolchain — no extra config.

Styling
Scoped CSS ModulesSupported

Component-scoped class names.

Styling
MiddlewareSupported

app/_middleware.js gates pages, API routes, loader data, and SSR — context.locals shared downstream.

Full-stack
Cookie helpersSupported

getCookie / setCookie / deleteCookie on @opentf/web/server — RFC 6265 helpers for middleware, API routes, and loaders.

Full-stack
Reactive formsBeta

@opentf/web-form — porting to the new runtime.

Full-stack
API routesSupported

File-based route.js / route.ts endpoints — standard Request/Response and dynamic params.

Full-stack
Data fetchingSupported

Route loaders (loader.js → router.data across SSR/SSG/SPA) + client-side resource(); queries and actions planned.

Full-stack
InternationalizationBeta

@opentf/web-i18n — URL-prefix locale routing, ICU messages, and Intl formatters (Phase 1).

Full-stack
Accessibility helpersPlanned

ARIA helpers and a11y defaults.

Full-stack

Build something native-first.

Scaffold a project in seconds and read the guides to go from zero to a compiled, signal-driven app.